package com.mlnx.mptp;

import com.google.common.base.Ascii;
import com.mlnx.mptp.serial.IReciver;
import com.mlnx.mptp.serial.Serial;
import com.mlnx.mptp.utils.AsciiUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import gnu.io.SerialPort;

/**
 * Created by amanda.shan on 2020/6/28.
 */
public class SerialDemo extends Serial {

    public SerialDemo() {
        super("COM13", 9600, SerialPort.PARITY_NONE, SerialPort.FLOWCONTROL_NONE);

        setReciver(new IReciver() {
            @Override
            public void recive(byte[] bs, int len) {
                if (len > 0) {
                    System.out.print(new String(bs, 0, len));
                }
            }
        });
    }

    private void bindNet(Integer index) throws IOException {

        byte[] bytes = null;

        switch (index) {
            // 重启模块
            case -10:
                bytes = AsciiUtils.append("AT+NRB".getBytes(), Ascii.CR);
                break;
            case -1:
                bytes = AsciiUtils.append("AT+NPSMR=?".getBytes(), Ascii.CR);
                break;
            case 0:
                bytes = AsciiUtils.append("AT".getBytes(), Ascii.CR);
                break;
            // 检查USIM卡是否初始化成功。串口通讯成功后可查询，若失败，延时1s后再查询。如果连续10次都失败，
            case 1:
                bytes = AsciiUtils.append("AT+CIMI".getBytes(), Ascii.CR);
                break;
            // USIM正常初始化之后，模块则开始搜寻网络。AT+CSQ可查询无线网络的RSSI的指示状态。取值范围0-31；99表示没有搜寻到网络
            case 2:
                bytes = AsciiUtils.append("AT+CSQ".getBytes(), Ascii.CR);
                break;
            // 查询模块的网络附着状态。返回值的第二个
            //参数为1表示成功附着本地网络；第二个参数
            //为5表示成功附着漫游网络；第二个参数为2
            //时表示模块正在注册。详细可参考相应模块
            //AT命令手册。MCU可以每隔1s查询一次
            case 3:
                bytes = AsciiUtils.append("AT+CEREG?".getBytes(), Ascii.CR);
                break;
            // 查询网络是否被激活 网络激活成功，通常需要等待 30s
            case 4:
                bytes = AsciiUtils.append("AT+CGATT?".getBytes(), Ascii.CR);
                break;
            // 查询模块的 IP 地址
            case 5:
                bytes = AsciiUtils.append("AT+CGPADDR".getBytes(), Ascii.CR);
                break;
            default:
                tcp(index);
                return;
        }

        send(bytes, bytes.length);
        System.out.println("发送: " + AsciiUtils.bytesToAscii(bytes, 0, bytes.length));
    }

    private void tcp(Integer index) throws IOException {
        byte[] bytes = null;

        switch (index) {
            // 设置注册模式
            case 11:
                bytes = AsciiUtils.append("AT+QREGSWT?".getBytes(), Ascii.CR);
                break;
            // 设置注册模式
            case 12:
                bytes = AsciiUtils.append("AT+QREGSWT=2".getBytes(), Ascii.CR);
                break;
            default:
                System.err.println("不识别的命令");
                return;
        }

        send(bytes, bytes.length);
        System.out.println("发送: " + AsciiUtils.bytesToAscii(bytes, 0, bytes.length));
    }

    public static void main(String[] args) {
        SerialDemo serialDemo = new SerialDemo();
        serialDemo.openSerialPort();

        InputStreamReader is = new InputStreamReader(System.in); //new构造InputStreamReader对象
        BufferedReader br = new BufferedReader(is); //拿构造的方法传到BufferedReader中

        String preCmd = "AT+IPR=?";

        try {
            while (true) {
                String cmd = br.readLine();
                try {
                    serialDemo.bindNet(Integer.valueOf(cmd));
                }catch (Exception e){
                    e.printStackTrace();
                    System.err.println("输入指令错误");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
